package business.coding.matching;

/**
 * Define los contextos y sus rangos en el matching entre corps dados y corps existentes.
 * 
 * El contexto es el numero de palabras que hacen matching entre el numero de palabras existentes en total, sin contar provincia ni pais.
 * 
 * TODO: Las palabras repetidas aun no esta claro como contabilizarlas
 * @author 53385255R
 *
 */
public class Context {
	
	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return _context + "";
	}


	/**
	 * contexto menor de 40
	 */
	public static final int _less40 = 0;
	/**
	 * Contexto entre 40 y 50
	 */
	public static final int _more40_less50 = 1;
	/**
	 * Contexto entre 50 y 60
	 */
	public static final int _more50_less60 = 2;
	/**
	 * Contexto entre 60 y 70
	 */
	public static final int _more60_less70 = 3;
	/**
	 * Contexto entre 70 y 80
	 */
	public static final int _more70_less80 = 4;
	/**
	 * Contexto entre 80 y 90
	 */
	public static final int _more80_less90 = 5;
	/**
	 * Contexto entre 90 y 100
	 */
	public static final int _more90_less100 = 6;
	/**
	 * Contexto de 100%, ni mas ni menos
	 */
	public static final int _100 = 7;
	/**
	 * Exacto, indica que no solo tiene el 100% de contexto sino que ademas el corp existente en el maestro no contiene
	 * otras palabras
	 */
	public static final int _exact = 8;
	/**
	 * Indica que el corp ya existe, tal cual, en el maestro
	 */
	public static final int _exists = 9;
	   
/**
 * contexto. Numero de palabras del corp a codificar que se encuentran en los corps del maestro.
 */
	private Double _context;
	
	/**
	 * Constructor vacio
	 */
	public Context() {
		
	}
	/**
	 * Inicializa el contexto
	 * @param ctxt valor del contexto
	 */
	public Context(Double ctxt) {
		_context = ctxt;
	}
	
	/**
	* Divide el contextos en 7 rangos
	* 0 - 39 es 0
	* 40 - 59 es 1
	* 60 - 69 es 2
	* 70 - 79 es 3
	* 80 - 89 es 4
	* 90 - 99 es 5
	* 100 es 6
	* 150 es 7 (para los matching del 100% exactos con el maestro)
	* 200 es 8 (para los ya existentes)
	* @return codigo del rango del contexto
	*/
   public int getContextRange() {
	   if (_context == null) return _less40;
	   if (_context < 40) return _less40;
	   if (_context >= 40 && _context < 50) return _more40_less50;
	   if (_context >= 50 && _context < 60) return _more50_less60;
	   if (_context >= 60 && _context < 70) return _more60_less70;
	   if (_context >= 70 && _context < 80) return _more70_less80;
	   if (_context >= 80 && _context < 90) return _more80_less90;
	   if (_context >= 90 && _context < 100) return _more90_less100;
	   if (_context >= 100 && _context != 200 && _context != 150) return _100;
	   if (_context == 150) return _exact;
	   if (_context == 200) return _exists;
	   return 0;
   }
   
   /**
    * Obtiene el rango de un contexto dado
 * @param context
 * @return rango del contexto dado
 */
public static int getContextRange(Double context) {
	   if (context == null) return _less40;
	   if (context < 40) return _less40;
	   if (context >= 40 && context < 50) return _more40_less50;
	   if (context >= 50 && context < 60) return _more50_less60;
	   if (context >= 60 && context < 70) return _more60_less70;
	   if (context >= 70 && context < 80) return _more70_less80;
	   if (context >= 80 && context < 90) return _more80_less90;
	   if (context >= 90 && context < 100) return _more90_less100;
	   if (context >= 100 && context != 200 && context != 150) return _100;
	   if (context == 150) return _exact;
	   if (context == 200) return _exists;
	   return 0;
   }
   
   /**
	 * @param _context
	 */
	public void set_context(Double _context) {
		this._context = _context;
	}
	
	/**
	 * especificando un rango le damos el mayor contexto para le mismo
	 * @param range
	 */
	public void set_context_by_range(int range) {
		 	if (range == _less40) _context = 39.0;
		 	if (range == _more40_less50) _context = 49.0;
		 	if (range == _more50_less60) _context = 59.0;
		 	if (range == _more60_less70) _context = 69.0;
		 	if (range == _more70_less80) _context = 79.0;
		 	if (range == _more80_less90) _context = 89.0;
		 	if (range == _more90_less100) _context = 99.0;
		 	if (range == _100) _context = 100.0;
		 	if (range == _exact) _context = 150.0;
		 	if (range == _exists) _context = 200.0;
	}

	/**
	 * Obtiene el contexto para el centro sobre el corp
	 * @return contexto
	 */
	public Double get_context() {
		return _context;
	}
	
  
  /**
   * 
* @return etiqueta con el rango
*/
public String getContextRangeText() {
	   if (_context == null) return "NaN";
	   if (_context < 40) return "< 40";
	   if (_context >= 40 && _context < 50) return ">= 40 Y < 50";
	   if (_context >= 50 && _context < 60) return ">= 50 Y < 60";
	   if (_context >= 60 && _context < 70) return ">= 60 Y < 70";
	   if (_context >= 70 && _context < 80) return ">= 70 Y < 80";
	   if (_context >= 80 && _context < 90) return ">= 80 Y < 90";
	   if (_context >= 90 && _context < 100) return ">= 90 Y < 100";
	   if (_context >= 100 && _context != 200 && _context != 150) return "100";
	   if (_context == 150) return "EXACTO";
	   if (_context == 200) return "Existente en maestro";
	   return "NaN";
  }
}
